home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 10 / FM Towns Free Software Collection 10.iso / ms_dos / lib / happyps3 / scnt.pas < prev   
Pascal/Delphi Source File  |  1995-02-07  |  4KB  |  101 lines

  1. (*********************************************************************
  2.  *  *** Pascal ステップカウントツール ***                            *
  3.  *                                                                   *
  4.  *        HAPPyのサンプルプログラム                                  *
  5.  *          (作者  浅野比富美 Public Domain Software)                *
  6.  *********************************************************************)
  7.  
  8. program StepCounter(source,output) ;
  9.  
  10.   var source : text    ;                { Pascalソースファイル            }
  11.       ch     : char    ;                { 読み込み文字                    }
  12.       lnum   : integer ;                { 行数                            }
  13.       snum   : integer ;                { ステップ数                      }
  14.       step   : Boolean ;                { ステップカウント対象行時  真    }
  15.  
  16. (*********************************)
  17. (* シフトJISコード1バイト目チェック汎用関数 *)     { 81h~9Fh  E0h~FCh だと真       }
  18. (*********************************)
  19.   function iskanji(ch : char) : Boolean ;
  20.     var intch : integer ;
  21.   begin
  22.     intch   := ord(ch) ;
  23.     iskanji := (intch-129 in [0..30]) or (intch-224 in [0..28])
  24.   end ;        { intch in [129..159,224..252] の表記は HAPPyでは不可(^^); }
  25.  
  26.  
  27. (******************************)
  28. (*      1文字読み込み         *)
  29. (******************************)
  30.   procedure nextch ;
  31.   begin
  32.     if eoln(source) then                { 改行コードの時                  }
  33.     begin
  34.       readln(source)   ;                { 改行コード読み飛ばし            }
  35.       lnum := lnum + 1 ;                { 行番号カウントアップ            }
  36.       if step then snum := snum + 1 ;   { 有効行の時 ステップ数カウント   }
  37.       step := false    ;
  38.       ch   := ' '                       { 空白に置き換え                  }
  39.     end
  40.     else read(source,ch)                { 改行でなければそのまま読む      }
  41.   end ;
  42.  
  43. (******************************)
  44. (*      注釈読み飛ばし        *)
  45. (******************************)
  46.   procedure skipComment ;
  47.     var endflag : Boolean ;             { 注釈の終わりの時 真             }
  48.   begin
  49.     repeat
  50.       nextch ;
  51.       while iskanji(ch) do              { シフトJISコードの1バイト目ならば     }
  52.       begin
  53.         nextch ; nextch                 { 2バイト分読み飛ばし             }
  54.       end ;
  55.       if ch = '*' then
  56.       begin
  57.         endflag := (source^ = ')') or (source^ = '}') ;
  58.                                { source^ には次の文字が入っているのがミソ }
  59.         if endflag then nextch
  60.       end
  61.       else endflag := ch = '}'
  62.     until endflag ;
  63.     nextch
  64.   end ;
  65.  
  66. (****************************)
  67. (*       メイン処理         *)
  68. (****************************)
  69. begin
  70.   reset(source) ;
  71.   lnum := 0     ;
  72.   snum := 0     ;
  73.   step := false ;
  74.   nextch        ;
  75.  
  76.   repeat
  77.     if (ch = ' ') or (ch = chr(9)) then nextch { 空白 水平タブは無視する  }
  78.     else if ch = '''' then              { 文字列の時                      }
  79.       repeat                            { '自身を指定する時 '' とすること }
  80.         repeat nextch until ch = '''' ; { になっているので そこを考慮する }
  81.         nextch
  82.       until ch <> ''''
  83.     else if ch = '{' then skipComment   { コメント読み飛ばし              }
  84.     else if ch = '(' then               { ( * 形式のコメントかチェック    }
  85.     begin
  86.       nextch ;
  87.       if ch = '*' then skipComment
  88.                   else step := true     { コメント始まり以外の ( は有効   }
  89.     end
  90.     else                                { プログラムとして有効な記号      }
  91.     begin
  92.       step := true ;
  93.       nextch
  94.     end
  95.   until eof(source) ;                   { 本当は 「end.」までだけど妥協    }
  96.  
  97.   writeln('行数       : ',lnum:5) ;
  98.   writeln('ステップ数 : ',snum:5) ;
  99.   writeln('コメント率 : ',(lnum-snum)/lnum*100:5:1,'%')
  100. end.
  101.